#include <stdio.h>
#include <iostream>
#include "CalProtoMaxSize.h"
#include <map>
#include <cctype>
#include <algorithm>
using namespace std;

//struct string
//{
//	string(string strName,int nSize):m_strName(strName),m_nSize(nSize)
//	{
//	}
//	string m_strName;
//	int m_nSize;
//};
typedef multimap<int,string> NameMap;

void PrintMap(NameMap& AllMap,int nPrintMode)
{
	if (nPrintMode == 1)
	{
		NameMap::iterator itBegin = AllMap.begin();
		NameMap::iterator itEnd = AllMap.end();
		for(;itBegin!= itEnd;itBegin++)
		{
			string& SStruct = itBegin->second;
			printf("%s = %d\n",SStruct.c_str(),itBegin->first);
		}
	}
	else if (nPrintMode == 2)
	{
		printf("Struct Name:");
		string Name2;
		cin>>Name2;
		NameMap::iterator itBegin = AllMap.begin();
		NameMap::iterator itEnd = AllMap.end();
		for(;itBegin!= itEnd;itBegin++)
		{
			string& SStruct = itBegin->second;
			string strTemp = itBegin->second;
			transform(SStruct.begin(), SStruct.end(), strTemp.begin(), toupper);
			transform(Name2.begin(), Name2.end(), Name2.begin(), toupper);
			if((strTemp.find(Name2,0)) != string::npos)
				printf("%s = %d\n",SStruct.c_str(),itBegin->first);
		}
	}
}	

//int CalProtoMaxSize(NameMap& AllMap,string& MaxName)
//{
//	string tempSize;
//	int nSize(0);
//	nSize = sizeof(string);
//	tempSize = "string";
//	AllMap[nSize] = tempSize;
//
//	nSize = sizeof(char);
//	tempSize = "char";
//	AllMap[nSize] = tempSize;
//
//	NameMap::iterator itBegin = AllMap.begin();
//	MaxName = itBegin->second;
//	return itBegin->first;
//}
int main(int argc, char* argv[])
{
	NameMap AllMap;
	string MaxName;
	int nSize = CalProtoMaxSize(AllMap,MaxName);
	printf("MaxProtoStruct:< %s=%d > \n",MaxName.c_str(),nSize);
	int nPrintMode;
	printf("1.printAll 2.printByName\n");
	while(cin>>nPrintMode)
	{
		PrintMap(AllMap,nPrintMode);
		printf("1.printAll 2.printByName\n");
	}
	return 0;
}